
<!DOCTYPE HTML>
<html lang="en" >
    <head>
        <meta charset="UTF-8">
        <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
        <title>User Scale · GitBook</title>
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="description" content="">
        <meta name="generator" content="GitBook 3.2.3">
        
        
        
    
    
    <link rel="stylesheet" href="../../gitbook/style.css">

    
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-mermaid-gb3/mermaid/mermaid.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-highlight/website.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-search/search.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-fontsettings/website.css">
                
            
        

    

    
        
    
        
    
        
    
        
    
        
    
        
    


    

        
    
    
    <meta name="HandheldFriendly" content="true"/>
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <link rel="apple-touch-icon-precomposed" sizes="152x152" href="../../gitbook/images/apple-touch-icon-precomposed-152.png">
    <link rel="shortcut icon" href="../../gitbook/images/favicon.ico" type="image/x-icon">

    
    <link rel="next" href="ble_ruler.html" />
    
    
    <link rel="prev" href="kitchen_scale.html" />
    

    </head>
    <body>
        
<div class="book">
    <div class="book-summary">
        
            
<div id="book-search-input" role="search">
    <input type="text" placeholder="Type to search" />
</div>

            
                <nav role="navigation">
                


<ul class="summary">
    
    

    

    
        
        
    
        <li class="chapter " data-level="1.1" data-path="../">
            
                <a href="../">
            
                    
                    Overview
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2" data-path="../guide/android.html">
            
                <a href="../guide/android.html">
            
                    
                    android
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.3" data-path="../guide/ios.html">
            
                <a href="../guide/ios.html">
            
                    
                    ios
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.4" >
            
                <span>
            
                    
                    work process
            
                </span>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.4.1" data-path="ble_scale.html">
            
                <a href="ble_scale.html">
            
                    
                    Common Bluetooth scale
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.4.2" data-path="ble_scale_custom_connect.html">
            
                <a href="ble_scale_custom_connect.html">
            
                    
                    Common Bluetooth Scale-Self-managed Bluetooth
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.4.3" data-path="kitchen_scale.html">
            
                <a href="kitchen_scale.html">
            
                    
                    Kitchen scale
            
                </a>
            

            
        </li>
    
        <li class="chapter active" data-level="1.4.4" data-path="ble_user_scale.html">
            
                <a href="ble_user_scale.html">
            
                    
                    User Scale
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.4.5" data-path="ble_ruler.html">
            
                <a href="ble_ruler.html">
            
                    
                    Bluetooth ruler
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.5" >
            
                <span>
            
                    
                    API
            
                </span>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.5.1" data-path="../api/QNBleApi.html">
            
                <a href="../api/QNBleApi.html">
            
                    
                    QNBleApi
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.5.1.1" data-path="../api/QNBleApi.html">
            
                <a href="../api/QNBleApi.html#initsdk">
            
                    
                    initSdk
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.1.2" data-path="../api/QNBleApi.html">
            
                <a href="../api/QNBleApi.html#getcursystemblestate">
            
                    
                    getCurSystemBleState
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.1.3" data-path="../api/QNBleApi.html">
            
                <a href="../api/QNBleApi.html#setsysblestatelistener">
            
                    
                    setSysBleStateListener
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.1.4" data-path="../api/QNBleApi.html">
            
                <a href="../api/QNBleApi.html#setbledevicediscoverylistener">
            
                    
                    setBleDeviceDiscoveryListener
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.1.5" data-path="../api/QNBleApi.html">
            
                <a href="../api/QNBleApi.html#setbleconnectionchangelistener">
            
                    
                    setBleConnectionChangeListener
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.1.6" data-path="../api/QNBleApi.html">
            
                <a href="../api/QNBleApi.html#setdataListener">
            
                    
                    setDataListener
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.1.7" data-path="../api/QNBleApi.html">
            
                <a href="../api/QNBleApi.html#setblekitchenlistener">
            
                    
                    setBleKitchenListener
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.1.8" data-path="../api/QNBleApi.html">
            
                <a href="../api/QNBleApi.html#setloglistener">
            
                    
                    setLogListener
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.1.9" data-path="../api/QNBleApi.html">
            
                <a href="../api/QNBleApi.html#startbledevicediscovery">
            
                    
                    startBleDeviceDiscovery
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.1.10" data-path="../api/QNBleApi.html">
            
                <a href="../api/QNBleApi.html#stopbledevicediscovery">
            
                    
                    stopBleDeviceDiscovery
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.1.11" data-path="../api/QNBleApi.html">
            
                <a href="../api/QNBleApi.html#connectdevice">
            
                    
                    connectDevice
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.1.12" data-path="../api/QNBleApi.html">
            
                <a href="../api/QNBleApi.html#connectuserscaledevice">
            
                    
                    connectUserScaleDevice
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.1.13" data-path="../api/QNBleApi.html">
            
                <a href="../api/QNBleApi.html#connectblekitchendevice">
            
                    
                    connectBleKitchenDevice
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.1.14" data-path="../api/QNBleApi.html">
            
                <a href="../api/QNBleApi.html#setblekitchendeviceconfig">
            
                    
                    setBleKitchenDeviceConfig
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.1.15" data-path="../api/QNBleApi.html">
            
                <a href="../api/QNBleApi.html#disconnectdevice">
            
                    
                    disconnectDevice
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.1.16" data-path="../api/QNBleApi.html">
            
                <a href="../api/QNBleApi.html#getconfig">
            
                    
                    getConfig
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.1.17" data-path="../api/QNBleApi.html">
            
                <a href="../api/QNBleApi.html#convertweightwithtargetunit">
            
                    
                    convertWeightWithTargetUnit
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.1.18" data-path="../api/QNBleApi.html">
            
                <a href="../api/QNBleApi.html#builddevice">
            
                    
                    buildDevice
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.1.19" data-path="../api/QNBleApi.html">
            
                <a href="../api/QNBleApi.html#buildprotocolhandler">
            
                    
                    buildProtocolHandler
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.1.20" data-path="../api/QNBleApi.html">
            
                <a href="../api/QNBleApi.html#generatescaledata">
            
                    
                    generateScaleData
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.1.21" data-path="../api/QNBleApi.html">
            
                <a href="../api/QNBleApi.html#physiquecalculation">
            
                    
                    physiqueCalculation
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.1.22" data-path="../api/QNBleApi.html">
            
                <a href="../api/QNBleApi.html#switchuserscaleuser">
            
                    
                    switchUserScaleUser
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.1.23" data-path="../api/QNBleApi.html">
            
                <a href="../api/QNBleApi.html#updateuserscaleidentifyweight">
            
                    
                    updateUserScaleIdentifyWeight
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.1.24" data-path="../api/QNBleApi.html">
            
                <a href="../api/QNBleApi.html#setblerulerlistener">
            
                    
                    setBleRulerListener
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.1.25" data-path="../api/QNBleApi.html">
            
                <a href="../api/QNBleApi.html#connectrulerdevice">
            
                    
                    connectRulerDevice
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.5.2" data-path="../api/QNUser.html">
            
                <a href="../api/QNUser.html">
            
                    
                    QNUser
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.3" data-path="../api/QNScaleData.html">
            
                <a href="../api/QNScaleData.html">
            
                    
                    QNScaleData
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.4" data-path="../api/QNScaleStoreData.html">
            
                <a href="../api/QNScaleStoreData.html">
            
                    
                    QNScaleStoreData
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.5" data-path="../api/QNScaleItemData.html">
            
                <a href="../api/QNScaleItemData.html">
            
                    
                    QNScaleItemData
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.6" data-path="../api/QNBleDevice.html">
            
                <a href="../api/QNBleDevice.html">
            
                    
                    QNBleDevice
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.7" data-path="../api/QNBleBroadcastDevice.html">
            
                <a href="../api/QNBleBroadcastDevice.html">
            
                    
                    QNBleBroadcastDevice
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.8" data-path="../api/QNBleKitchenDevice.html">
            
                <a href="../api/QNBleKitchenDevice.html">
            
                    
                    QNBleKitchenDevice
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.9" data-path="../api/QNConfig.html">
            
                <a href="../api/QNConfig.html">
            
                    
                    QNConfig
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.10" data-path="../api/QNWiFiConfig.html">
            
                <a href="../api/QNWiFiConfig.html">
            
                    
                    QNWiFiConfig
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.11" data-path="../api/QNUserScaleConfig.html">
            
                <a href="../api/QNUserScaleConfig.html">
            
                    
                    QNUserScaleConfig
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.12" data-path="../api/QNBleKitchenConfig.html">
            
                <a href="../api/QNBleKitchenConfig.html">
            
                    
                    QNBleKitchenConfig
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.13" data-path="../api/QNBleStateListener.html">
            
                <a href="../api/QNBleStateListener.html">
            
                    
                    QNBleStateListener
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.14" data-path="../api/QNBleDeviceDiscoveryListener.html">
            
                <a href="../api/QNBleDeviceDiscoveryListener.html">
            
                    
                    QNBleDeviceDiscoveryListener
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.15" data-path="../api/QNBleConnectionChangeListener.html">
            
                <a href="../api/QNBleConnectionChangeListener.html">
            
                    
                    QNBleConnectionChangeListener
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.16" data-path="../api/QNScaleDataListener.html">
            
                <a href="../api/QNScaleDataListener.html">
            
                    
                    QNScaleDataListener
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.17" data-path="../api/QNUserScaleDataListener.html">
            
                <a href="../api/QNUserScaleDataListener.html">
            
                    
                    QNUserScaleDataListener
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.18" data-path="../api/QNBleKitchenListener.html">
            
                <a href="../api/QNBleKitchenListener.html">
            
                    
                    QNBleKitchenListener
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.19" data-path="../api/QNLogListener.html">
            
                <a href="../api/QNLogListener.html">
            
                    
                    QNLogListener
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.20" data-path="../api/QNResultCallback.html">
            
                <a href="../api/QNResultCallback.html">
            
                    
                    QNResultCallback
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.21" data-path="../api/QNShareData.html">
            
                <a href="../api/QNShareData.html">
            
                    
                    QNShareData
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.22" data-path="../api/QNUtils.html">
            
                <a href="../api/QNUtils.html">
            
                    
                    QNUtils
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.23" data-path="../api/QNBleProtocolHandler.html">
            
                <a href="../api/QNBleProtocolHandler.html">
            
                    
                    QNBleProtocolHandler
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.24" data-path="../api/QNBleProtocolDelegate.html">
            
                <a href="../api/QNBleProtocolDelegate.html">
            
                    
                    QNBleProtocolDelegate
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.25" data-path="../api/QNWspScaleDataListener.html">
            
                <a href="../api/QNWspScaleDataListener.html">
            
                    
                    QNWspScaleDataListener
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.26" data-path="../api/QNBleRulerDevice.html">
            
                <a href="../api/QNBleRulerDevice.html">
            
                    
                    QNBleRulerDevice
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.27" data-path="../api/QNBleRulerData.html">
            
                <a href="../api/QNBleRulerData.html">
            
                    
                    QNBleRulerData
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.28" data-path="../api/QNBleRulerListener.html">
            
                <a href="../api/QNBleRulerListener.html">
            
                    
                    QNBleRulerListener
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.6" >
            
                <span>
            
                    
                    Schedule
            
                </span>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.6.1" data-path="../attouched_list/faq.html">
            
                <a href="../attouched_list/faq.html">
            
                    
                    FAQ
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.2" data-path="../attouched_list/body_indexes.html">
            
                <a href="../attouched_list/body_indexes.html">
            
                    
                    Body Index Constant
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.3" data-path="../attouched_list/device_type.html">
            
                <a href="../attouched_list/device_type.html">
            
                    
                    Device Type
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.4" data-path="../attouched_list/display_module_type.html">
            
                <a href="../attouched_list/display_module_type.html">
            
                    
                    Display module type
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.5" data-path="../attouched_list/body_shape.html">
            
                <a href="../attouched_list/body_shape.html">
            
                    
                    Body shape comparison table
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.6" data-path="../attouched_list/error_code.html">
            
                <a href="../attouched_list/error_code.html">
            
                    
                    Error Code
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.7" data-path="../attouched_list/area_type.html">
            
                <a href="../attouched_list/area_type.html">
            
                    
                    Area Type
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.8" data-path="../attouched_list/scan_error.html">
            
                <a href="../attouched_list/scan_error.html">
            
                    
                    Scan Error Code
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.9" data-path="../attouched_list/scale_state.html">
            
                <a href="../attouched_list/scale_state.html">
            
                    
                    Scale State Definition
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.10" data-path="../attouched_list/scale_event.html">
            
                <a href="../attouched_list/scale_event.html">
            
                    
                    Scale event definition
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.11" data-path="../attouched_list/test_list.html">
            
                <a href="../attouched_list/test_list.html">
            
                    
                    Test Case
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.12" data-path="../history/history.html">
            
                <a href="../history/history.html">
            
                    
                    Update Log
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    

    

    <li class="divider"></li>

    <li>
        <a href="https://www.gitbook.com" target="blank" class="gitbook-link">
            Published with GitBook
        </a>
    </li>
</ul>


                </nav>
            
        
    </div>

    <div class="book-body">
        
            <div class="body-inner">
                
                    

<div class="book-header" role="navigation">
    

    <!-- Title -->
    <h1>
        <i class="fa fa-circle-o-notch fa-spin"></i>
        <a href=".." >User Scale</a>
    </h1>
</div>




                    <div class="page-wrapper" tabindex="-1" role="main">
                        <div class="page-inner">
                            
<div id="book-search-results">
    <div class="search-noresults">
    
                                <section class="normal markdown-section">
                                
                                <h1 id="user-scale">User Scale</h1>
<p>The user scale is a smart device launched by our company that supports displaying the measurement results directly on the scale display. The user can register the scale end user. Even without app , the measurement data results can be directly displayed on the scale end ,which improves the user experience. User scales are divided into Bluetooth scales and Bluetooth WiFi dual-mode scales in terms of communication methods. In use, the working mode of the two devices in Bluetooth mode is the same. Compared with the Bluetooth model, the Bluetooth WiFi dual-mode scale will have more functions such as measurement in WiFi mode.</p>
<p>For the Bluetooth WiFi dual-mode scale, in addition to using the Bluetooth function, it needs to be connected to the SDK, and it also needs to cooperate with the server integration <a href="https://github.com/YolandaQingniu/qn_wsp_full_server_doc/blob/main/README.en.md" target="_blank">Docker</a>.</p>
<h2 id="using-measurements-briefly">Using Measurements Briefly</h2>
<p>After the scale and the APP are connected through Bluetooth, the APP sends the basic information of the measurement user to the scale. When the measurement is completed, the scale will display the measurement results and upload the measurement data details to the APP.</p>
<p>At present, the user scale device can store up to 8 user information, and the user on the scale end needs to register the user with the device through a Bluetooth connection. Once 8 users has registered&#xFF0C;the scale will return the status of registration failure if user is registered to the device again. Therefore, it is recommended that you release the list of registered users on the scale before registering users to avoid invalid users occupying resources.</p>
<p>1.When we register user on the device, the device will record the user&apos;s secret key (not required) if registration is successful and return to the user&apos;s unique serial number. Therefore, after registering the user successfully, the app needs to save the serial number returned by the device to the user. When updating user information through Bluetooth connection or user measuring through Bluetooth connection, it is necessary to use the user serial number to access the designated user on the scale . At the same time, the serial number is also used as the identification of which registered user the device uploads the measurement data to, and as a necessary condition for deleting the user.</p>
<ul>
<li><p>registered user</p>
<p>The scale can cache the registered user information, identify which user the measurement data belongs to when the Bluetooth is not connected through the registered user information, and use the identified user information to obtain detailed measurement data</p>
</li>
<li><p>access user</p>
<p>When operating the scale, you need to access the registered user first, and only after the access is successful can you perform corresponding operations, such as modifying user information, connecting to Bluetooth for measurement, etc.</p>
</li>
</ul>
<h2 id="guest-mode-measurements">Guest Mode Measurements</h2>
<p>The guest mode is a measurement method of a public channel provided by the scale. This method can be used directly without registering . In the guest mode , the user account is temporary. Its existence is from connection to disconnection. When the device is disconnected, the temporary user account will be destroyed .Besides,it can&#x2019;t generate,receive and store data .</p>
<h2 id="device-protocol-brief">Device Protocol Brief</h2>
<p>Aspects covered by the agreement:</p>
<ul>
<li>User<ul>
<li>Age</li>
<li>Height</li>
<li>Gender</li>
</ul>
</li>
<li>Measurement<ul>
<li>Measurement status</li>
<li>Real-time weight</li>
<li>Storing data</li>
<li>Measurement data</li>
</ul>
</li>
<li>Distribution network<ul>
<li>WiFi name</li>
<li>WiFi password</li>
<li>Data upload address</li>
<li>Distribution results</li>
</ul>
</li>
<li>Other<ul>
<li>Unit</li>
</ul>
</li>
</ul>
<p>The device involves many aspects, and the communication process between protocols and the enabling method are strictly required. Our company has packaged it into SDK for easy access.</p>
<h2 id="work-process">Work process</h2>
<ul>
<li><p>Registered scale user measurement sequence diagram</p>
<p><img src="../images/firstUseOfBindingNetwork.png" alt=""></p>
</li>
<li><p>Bluetooth Access User Measurement Timing Diagram</p>
<p><img src="../images/connectBluetoothMeasurement.png" alt=""></p>
</li>
<li><p>WiFi network distribution timing diagram</p>
<p><img src="../images/distributionNetwork.png" alt=""></p>
</li>
<li><p>Normal measurement timing diagram in WiFi mode</p>
<p><img src="../images/connectWiFiMeasurement.png" alt=""></p>
</li>
<li><p>Measurement timing diagram for unidentified users in WiFi mode</p>
<p><img src="../images/connectWiFiUnknownMeasurement.png" alt=""></p>
</li>
</ul>
<h2 id="implementation-of-specific-access-equipment">Implementation of specific access equipment</h2>
<h3 id="initialize-qnsdk">Initialize QNSDK</h3>
<p>Use <a href="../api/QNBleApi.html#initSdk">QNBleApi.initSdk</a> to initialize QNSDK.</p>
<h3 id="set-listener">Set listener</h3>
<h4 id="1-set-the-system-bluetooth-in-listening-state">1. Set the system Bluetooth in listening state</h4>
<p>  Set the system Bluetooth in listening state <a href="../api/QNBleApi.html#setsysblestatelistener">QNBleApi.setSysBleStateListener</a> Bluetooth status of the mobile phone system.</p>
<h4 id="2-set-scanning-device-in-monitoringlistening-state">2. Set scanning device in monitoring/listening state</h4>
<p>  Set scanning device in monitoring/listening state <a href="../api/QNBleApi.html#setbledevicediscoverylistener">QNBleApi.setBleDeviceDiscoveryListener</a>,  to receive the information sent by the SDK and discover the device information.</p>
<h4 id="3-set-up-bluetooth-connection-change-monitoring">3. Set up Bluetooth connection change monitoring</h4>
<p>  Set the Bluetooth connection change listener <a href="../api/QNBleApi.html#setbleconnectionchangelistener">QNBleApi.setBleConnectionChangeListener</a> to receive the device link status changes returned by the SDK.</p>
<h4 id="4-set-up-bluetooth-connection-change-monitoring">4. Set up Bluetooth connection change monitoring</h4>
<p>  Set the measurement data listener <a href="../api/QNBleApi.html#setdatalistener">QNBleApi.setDataListener</a> to receive the measurement status and measurement data returned by the SDK.</p>
<p>android example:</p>
<pre><code class="lang-java">QNBleApi mQNBleApi = QNBleApi.getInstance(<span class="hljs-keyword">this</span>);

mQNBleApi.setBleDeviceDiscoveryListener(<span class="hljs-keyword">new</span> QNBleDeviceDiscoveryListener() {
    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onDeviceDiscover</span><span class="hljs-params">(QNBleDevice qnBleDevice)</span> </span>{
      <span class="hljs-comment">// Scanned bluetooth device callback</span>
    }

    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onStartScan</span><span class="hljs-params">()</span> </span>{
      <span class="hljs-comment">//Start scan success callback</span>
    }

    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onStopScan</span><span class="hljs-params">()</span> </span>{
      <span class="hljs-comment">// Callback after stop scanning</span>
    }

    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onScanFail</span><span class="hljs-params">(<span class="hljs-keyword">int</span> i)</span> </span>{
      <span class="hljs-comment">//scan fail callback</span>
    }

    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onBroadcastDeviceDiscover</span><span class="hljs-params">(QNBleBroadcastDevice qnBleBroadcastDevice)</span> </span>{
      <span class="hljs-comment">//Callback of broadcast scale equipment related information</span>
    }

    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onKitchenDeviceDiscover</span><span class="hljs-params">(QNBleKitchenDevice qnBleKitchenDevice)</span> </span>{
      <span class="hljs-comment">//Callback of kitchen scale equipment related information</span>
    }
});

mQNBleApi.setBleConnectionChangeListener(<span class="hljs-keyword">new</span> QNBleConnectionChangeListener() {
    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onConnecting</span><span class="hljs-params">(QNBleDevice qnBleDevice)</span> </span>{
      <span class="hljs-comment">//The device is being connected, after calling the connected device, it will call back immediately</span>
    }

    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onConnected</span><span class="hljs-params">(QNBleDevice qnBleDevice)</span> </span>{
      <span class="hljs-comment">//The device is connected successfully</span>
    }

    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onServiceSearchComplete</span><span class="hljs-params">(QNBleDevice qnBleDevice)</span> </span>{
      <span class="hljs-comment">//The service search of the device is completed, and it will be called after onConnected under normal circumstances</span>
    }

    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onDisconnecting</span><span class="hljs-params">(QNBleDevice qnBleDevice)</span> </span>{
      <span class="hljs-comment">//The connection is being disconnected, when the disconnection is called, it will call back immediately</span>
    }

    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onDisconnected</span><span class="hljs-params">(QNBleDevice qnBleDevice)</span> </span>{
      <span class="hljs-comment">//Disconnect, callback after disconnection</span>
    }

    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onConnectError</span><span class="hljs-params">(QNBleDevice qnBleDevice, <span class="hljs-keyword">int</span> i)</span> </span>{
      <span class="hljs-comment">//A connection error occurred, please refer to the attached table for the error code</span>
    }
});

mQNBleApi.setDataListener(<span class="hljs-keyword">new</span> QNScaleDataListener() {
    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onGetUnsteadyWeight</span><span class="hljs-params">(QNBleDevice qnBleDevice, <span class="hljs-keyword">double</span> v)</span> </span>{
      <span class="hljs-comment">//Real-time weight data callback</span>
    }

    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onGetScaleData</span><span class="hljs-params">(QNBleDevice qnBleDevice, QNScaleData qnScaleData)</span> </span>{
      <span class="hljs-comment">//Stable data callback</span>
    }

    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onGetStoredScale</span><span class="hljs-params">(QNBleDevice qnBleDevice, List&lt;QNScaleStoreData&gt; list)</span> </span>{
      <span class="hljs-comment">//store data callback</span>
    }

    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onGetElectric</span><span class="hljs-params">(QNBleDevice qnBleDevice, <span class="hljs-keyword">int</span> i)</span> </span>{
      <span class="hljs-comment">//The battery percentage value callback of the charging model</span>
    }

    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onScaleStateChange</span><span class="hljs-params">(QNBleDevice qnBleDevice, <span class="hljs-keyword">int</span> i)</span> </span>{
      <span class="hljs-comment">//Connection status callback during measurement</span>
    }

    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onScaleEventChange</span><span class="hljs-params">(QNBleDevice qnBleDevice, <span class="hljs-keyword">int</span> i)</span> </span>{
      <span class="hljs-comment">//callback for scale event</span>
    }
});
</code></pre>
<p>iOS example:</p>
<pre><code>//set proxy
QNBleApi *bleApi = [QNBleApi sharedBleApi];
bleApi.bleStateListener = self;
bleApi.discoveryListener = self;
bleApi.connectionChangeListener = self;
bleApi.dataListener = self;

//implement the proxy method
- (void)onBleSystemState:(QNBLEState)state {
   //Callback for system bluetooth status
}

- (void)onStartScan {
    // Callback when scanning starts
}

- (void)onDeviceDiscover:(QNBleDevice *)device {
    // Callback when device is found
    //You can judge whether the device needs to be connected after the callback device is sent
}

- (void)onStopScan {
    // Callback when scanning is stopped
}

- (void)onConnecting:(QNBleDevice *)device {
    // Callback being connected
}

- (void)onConnected:(QNBleDevice *)device {
    // callback for successful connection
}

- (void)onDisconnected:(QNBleDevice *)device {
    //device disconnect
}

- (void)registerUserComplete:(QNBleDevice *)device user:(QNUser *)user {
   //The registered user successfully calls back the user information on the scale
   //APP can obtain the index assigned to the user by the scale in this method, and save the user information on the scale
}

- (void)onGetUnsteadyWeight:(QNBleDevice *)device weight:(double)weight {
    //Receive real-time data callback
}

- (void)onGetScaleData:(QNBleDevice *)device data:(QNScaleData *)scaleData {
   //Receive stable data callback
}

- (void)onGetStoredScale:(QNBleDevice *)device data:(NSArray &lt;QNScaleStoreData *&gt; *)storedDataList {
    //Receive the stored data callback
}

- (void)onScaleStateChange:(QNBleDevice *)device scaleState:(QNScaleState)state {
   //scale connection or measurement state change callback
}
</code></pre><h3 id="start-the-scan">Start the scan</h3>
<p>After confirming that Bluetooth is turned on, the Android side also needs to check the <code>Location Permission</code> and <code>Location Switch</code>. If you confirm that Bluetooth is turned on, the location permission is authorized, and the location service switch is turned on, you can start Bluetooth scanning</p>
<blockquote>
<p>After Android 6.0, for apps with targetSdkVersion&gt;=23 and above, Bluetooth scanning needs to obtain positioning permission. For details, see <a href="https://developer.android.com/guide/topics/connectivity/bluetooth-le" target="_blank">About</a>
The location service switch is not mandatory, but some mobile phones do not turn on this switch and cannot scan the device, which is related to the mobile phone system of each company</p>
<p>The iOS13 system has added Bluetooth access rights, you need to check whether you have access rights, and start scanning after confirming that it has been authorized and Bluetooth is turned on</p>
</blockquote>
<p>The scan method is <a href="../api/QNBleApi.html#startbledevicediscovery">QNBleApi.startBleDeviceDiscovery</a>, and the scanned device data will be called back in the scan interface set above <a href="../api/QNBleDeviceDiscoveryListener.html">QNBleDeviceDiscoveryListener</a>.</p>
<p>In addition, some feature settings related to scanning can be set in <a href="../api/QNConfig.html">QNConfig</a>, and the content that needs to be set has been basically covered.</p>
<blockquote>
<p>Usually APP will have a dedicated interface for measurement. We usually scan the Bluetooth after the interface is displayed, and stop scanning when the interface disappears.</p>
</blockquote>
<p>android example:</p>
<pre><code class="lang-java">QNBleApi.getInstance(context).startBleDeviceDiscovery(<span class="hljs-keyword">new</span> QNResultCallback() {
            <span class="hljs-meta">@Override</span>
            <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onResult</span><span class="hljs-params">(<span class="hljs-keyword">int</span> code, String msg)</span> </span>{
                <span class="hljs-comment">//This method does not return to the device, but indicates whether the scan was started successfully</span>
                <span class="hljs-keyword">if</span> (code != CheckStatus.OK.getCode()) {
                   ToastMaker.show(ScanActivity.<span class="hljs-keyword">this</span>,code+<span class="hljs-string">&quot;:&quot;</span>+msg);
                }
            }
        });
</code></pre>
<p>iOS example:</p>
<pre><code>//start scan
[[QNBleApi sharedBleApi] startBleDeviceDiscovery:^(NSError *error) {
    //The callback here indicates whether the startup scan method is successful
    if (error) {
        NSLog([NSString stringWithFormat:@&quot;Failed to start scan method, reason: %@&quot;,error]);
    }
}];
</code></pre><h3 id="connect-device-accessregistration-measurement">Connect device access/registration measurement</h3>
<h4 id="1-connect-the-device">1. Connect the device</h4>
<p>After the APP receives the SDK callback device, it can judge whether it is a device that needs to be connected (this belongs to the business logic of the APP), and realize the connection device by calling the <a href="../api/QNBleApi.html#connectuserscaledevice">QNBleApi.connectUserScaleDevice</a> method. .</p>
<p>When we connects a device,  <a href="../api/QNBleApi.html#connectuserscaledevice">QNBleApi.connectUserScaleDevice</a> passes the parameter <a href="../api/QNUser.html#index">QNUserScaleConfig.curUser.index</a> , and the user index is greater than 0, it will be considered that this connection goes through the access measurement process When the user index is equal to 0, the SDK will consider that this connection needs to go through the registration measurement process.
Of course, by setting <a href="../api/QNUserScaleConfig.html#isvisitor">QNUserScaleConfig.isVisitor</a>, the SDK will consider this measurement as a visitor visit measurement, and the scale will not assign an index to the user to register the scale user. The transmitted user information is only valid for this measurement.</p>
<p>android example:</p>
<pre><code class="lang-java"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onDeviceDiscover</span><span class="hljs-params">(QNBleDevice qnBleDevice)</span> </span>{
  <span class="hljs-comment">// Scanned bluetooth device callback</span>
  QNUserScaleConfig mQNUserScaleConfig= <span class="hljs-keyword">new</span> QNUserScaleConfig();
  mQNUserScaleConfig.setCurUser(qnUser);
  <span class="hljs-comment">//mQNUserScaleConfig.setVisitor(true);</span>
  mQNBleApi.connectUserScaleDevice(mBleDevice,mQNUserScaleConfig,mCallback);
}
</code></pre>
<p>iOS example:</p>
<pre><code>- (void)onDeviceDiscover:(QNBleDevice *)device {
    // Callback when device is found
    if (isConnect) {
        QNUserScaleConfig *config = userConfig;
        config.user.index = userIndex;
        config.user.secret = userSecret;
        //config.isVisitor = YSE;
        [[QNBleApi sharedBleApi] connectUserScaleDevice:device config:config callback:^(NSError *error) {
        }];
    }
}
</code></pre><p>In addition, before calling the connection, you&#x2019;d better to stop the previous scan (we found that some mobile phones have Bluetooth scanning and Bluetooth connection at the same time, which will reduce the failure rate of successful connection). After stopping scanning , delaying 200~500ms before calling the connection will increase the success rate of the connection.
The method to stop Bluetooth scanning is: <a href="../api/QNBleApi.html#stopbledevicediscovery">QNBleApi.stopBleDeviceDiscovery</a>.</p>
<p>android example:</p>
<pre><code class="lang-java">QNBleApi.getInstance(context).stopBleDeviceDiscovery(<span class="hljs-keyword">new</span> QNResultCallback() {
    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onResult</span><span class="hljs-params">(<span class="hljs-keyword">int</span> code, String msg)</span> </span>{
        <span class="hljs-keyword">if</span> (code == CheckStatus.OK.getCode()) {
            isScanning = <span class="hljs-keyword">false</span>;
        }
    }
});
</code></pre>
<p>iOS example:</p>
<pre><code>[[QNBleApi sharedBleApi] stopBleDeviceDiscovery:^(NSError *error) {
    //The callback here indicates whether the stop scanning method is successful
    if (error) {
        NSLog([NSString stringWithFormat:@&quot;Failed to stop scanning method, reason: %@&quot;,error]);
    }
}];
</code></pre><h4 id="2-measurement-data">2. Measurement data</h4>
<p>The data and status of the weighing process will be called back in the above-mentioned <a href="../api/QNScaleDataListener.html">QNScaleDataListener</a></p>
<h4 id="3-measurement-ends">3. Measurement ends</h4>
<p>After receiving stable data (that is, receiving <a href="../api/QNScaleDataListener.html#ongetscalesata">QNScaleDataListener.onGetScaleData</a>), the measurement is completed, and the device will automatically disconnect.</p>
<p>So far, the basic process of the device has been completed, and the APP can save the data and display the data by itself after receiving the stable data. Data standard judgment can be done in our way-<a href="../attouched_list/SDK%20indicator%20standard%20description.pdf">SDK indicator standard description</a>.</p>
<h3 id="bluetooth-wifi-dual-mode-scale-configuration-network">Bluetooth WiFi dual-mode scale configuration network</h3>
<p>For the Bluetooth WiFi dual-mode scale, in addition to using the Bluetooth function, it needs to be connected to the SDK, and it also needs to cooperate with the server integration <a href="https://github.com/YolandaQingniu/qn_wsp_full_server_doc/blob/main/README.en.md" target="_blank">Docker</a>.</p>
<h4 id="1-connect-the-device">1. Connect the device</h4>
<p>After the APP receives the SDK callback device, it can determine whether to configure the device WiFi for the device that needs to be connected (this belongs to the business logic of the APP), by calling the <a href="../api/QNBleApi.html#connectuserscaledevice">QNBleApi.connectUserScaleDevice</a> method to Implement connected devices to configure WiFi.</p>
<p>When connecting a device, when the parameter <a href="../api/QNWiFiConfig.html">QNUserScaleConfig.wifiConfig</a> passed by <a href="../api/QNBleApi.html#connectuserscaledevice">QNBleApi.connectUserScaleDevice</a> is not nil, the SDK will consider this connection Need to go through the distribution network process.
Where <a href="../api/QNUserScaleConfig.html#dataurl">QNUserScaleConfig.dataUrl</a> represents the server address for uploading measurement data in WiFi mode (usually the APP background address), <a href="../api/QNUserScaleConfig.md%20#otaurl">QNUserScaleConfig.otaUrl</a> represents the OTA firmware address in WiFi mode.
android example:</p>
<pre><code class="lang-java"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onDeviceDiscover</span><span class="hljs-params">(QNBleDevice qnBleDevice)</span> </span>{
  <span class="hljs-comment">// Scanned bluetooth device callback</span>
  QNUserScaleConfig mQNUserScaleConfig= <span class="hljs-keyword">new</span> QNUserScaleConfig();
  QNWiFiConfig mWiFiConfig = <span class="hljs-keyword">new</span> QNWiFiConfig();
  mWiFiConfig.setSsid(wifiname);
  mWiFiConfig.setPwd(password);
  mWiFiConfig.setServeUrl(<span class="hljs-string">&quot;http://www.sample.com&quot;</span>);
  mQNUserScaleConfig.setWifiConfig(mWiFiConfig);
  mQNUserScaleConfig.setOtaUrl(<span class="hljs-string">&quot;http://www.sample.com&quot;</span>);
  mQNBleApi.connectUserScaleDevice(mBleDevice,mQNUserScaleConfig,mCallback);
}
</code></pre>
<p>iOS example:</p>
<pre><code>- (void)onDeviceDiscover:(QNBleDevice *)device {
    // Callback when device is found
    if (isConnect) {
        QNUserScaleConfig *config = [[QNUserScaleConfig alloc] init];
        config.wifiConfig = wifiConfig;
        config.dataUrl = @&quot;http://hostname:port/path/&quot;; //Maximum length is 128 bytes
        config.otaUrl = @&quot;protocol://hostname[:port]/path/&quot;;//The maximum length is 128 bytes
        [[QNBleApi sharedBleApi] connectUserScaleDevice:device config:config callback:^(NSError *error) {
        }];
    }
}
</code></pre><h4 id="2-monitor-callback-configuration-network-status">2. Monitor callback configuration network status</h4>
<p>The network configuration state will be called back in <a href="../api/QNScaleDataListener.html#onscalestatechange">QNScaleDataListener.onScaleStateChange:</a>.</p>
<pre><code class="lang-java"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onScaleStateChange</span><span class="hljs-params">(QNBleDevice qnBleDevice, <span class="hljs-keyword">int</span> i)</span> </span>{
  <span class="hljs-comment">//Connection status callback during measurement</span>
  <span class="hljs-keyword">switch</span>(bleStatus) {
            <span class="hljs-keyword">case</span> QNScaleStatus.STATE_WIFI_BLE_START_NETWORK:
                <span class="hljs-comment">//Start distribution network</span>
                stateString = getResources().getString(R.string.start_set_wifi);
                btnString = getResources().getString(R.string.disconnected);
                <span class="hljs-keyword">break</span>;
            <span class="hljs-keyword">case</span> QNScaleStatus.STATE_WIFI_BLE_NETWORK_FAIL:
                <span class="hljs-comment">// start failed</span>
                stateString = getResources().getString(R.string.failed_to_set_wifi);
                btnString = getResources().getString(R.string.disconnected);
                <span class="hljs-keyword">break</span>;
            <span class="hljs-keyword">case</span> QNScaleStatus.STATE_WIFI_BLE_NETWORK_SUCCESS:
                <span class="hljs-comment">// start successfully</span>
                stateString = getResources().getString(R.string.success_to_set_wifi);
                btnString = getResources().getString(R.string.disconnected);
                <span class="hljs-keyword">break</span>;
        }
}
</code></pre>
<p>iOS example:</p>
<pre><code>- (void)onScaleStateChange:(QNBleDevice *)device scaleState:(QNScaleState)state {
   if (state == DeviceStyleWifiBleStartNetwork) {
       //Start distribution network
   }else if (state == DeviceStyleWifiBleNetworkSuccess){
       //The network distribution is successful
   }else if (state == DeviceStyleWifiBleNetworkFail){
       // Failed to configure the network
   }

}
</code></pre>
                                
                                </section>
                            
    </div>
    <div class="search-results">
        <div class="has-results">
            
            <h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
            <ul class="search-results-list"></ul>
            
        </div>
        <div class="no-results">
            
            <h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
            
        </div>
    </div>
</div>

                        </div>
                    </div>
                
            </div>

            
                
                <a href="kitchen_scale.html" class="navigation navigation-prev " aria-label="Previous page: Kitchen scale">
                    <i class="fa fa-angle-left"></i>
                </a>
                
                
                <a href="ble_ruler.html" class="navigation navigation-next " aria-label="Next page: Bluetooth ruler">
                    <i class="fa fa-angle-right"></i>
                </a>
                
            
        
    </div>

    <script>
        var gitbook = gitbook || [];
        gitbook.push(function() {
            gitbook.page.hasChanged({"page":{"title":"User Scale","level":"1.4.4","depth":2,"next":{"title":"Bluetooth ruler","level":"1.4.5","depth":2,"path":"flow/ble_ruler.md","ref":"flow/ble_ruler.md","articles":[]},"previous":{"title":"Kitchen scale","level":"1.4.3","depth":2,"path":"flow/kitchen_scale.md","ref":"flow/kitchen_scale.md","articles":[]},"dir":"ltr"},"config":{"plugins":["mermaid-gb3"],"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"pluginsConfig":{"mermaid-gb3":{},"highlight":{},"search":{},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"fontsettings":{"theme":"white","family":"sans","size":2},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false}},"theme":"default","pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"variables":{},"language":"en","gitbook":"*"},"file":{"path":"flow/ble_user_scale.md","mtime":"2022-12-12T02:59:26.571Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2023-01-16T11:02:39.181Z"},"basePath":"..","book":{"language":"en"}});
        });
    </script>
</div>

        
    
    <script src="../../gitbook/gitbook.js"></script>
    <script src="../../gitbook/theme.js"></script>
    
        
        <script src="../../gitbook/gitbook-plugin-mermaid-gb3/book/plugin.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-search/search-engine.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-search/search.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-lunr/lunr.min.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-lunr/search-lunr.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-sharing/buttons.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-fontsettings/fontsettings.js"></script>
        
    

    <script src="../../gitbook/gitbook-plugin-mermaid-gb3/mermaid/mermaid.min.js"></script>

    </body>
</html>

